package com.gt.app.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gt.app.common.DrugEnum;
import com.gt.app.domain.EsDrugType;
import com.gt.app.domain.EsUseDrugInfo;
import com.gt.app.domain.dto.EsUseDrugInfoDto;
import com.gt.app.mapper.EsUseDrugInfoMapper;
import com.gt.app.service.EsDrugTypeService;
import com.gt.app.service.EsUseDrugInfoService;
import com.gt.app.util.CommonUtils;
import com.gt.common.utils.StringUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 服用药物情况表 服务实现类
 * </p>
 *
 * @author caidesheng
 */
@Slf4j
@Service
public class EsUseDrugInfoServiceImpl extends ServiceImpl<EsUseDrugInfoMapper, EsUseDrugInfo> implements EsUseDrugInfoService {


    @Autowired
    private EsDrugTypeService esDrugTypeService;

    @Override
    @Transactional
    public void add(EsUseDrugInfoDto esUseDrugInfoDto) {
        if (esUseDrugInfoDto == null){
            return;
        }
        LambdaQueryWrapper<EsUseDrugInfo> queryWrapper = new LambdaQueryWrapper<>();
        LambdaQueryWrapper<EsUseDrugInfo> eq = queryWrapper.eq(EsUseDrugInfo::getEsCheckId, esUseDrugInfoDto.getEsCheckId());
        EsUseDrugInfo useDrugInfo = this.getOne(eq);
        if (useDrugInfo != null) {
            this.remove(eq);
            LambdaQueryWrapper<EsDrugType> wrapper = new LambdaQueryWrapper<EsDrugType>().eq(EsDrugType::getDrugOrdrowid, useDrugInfo.getOrdrowid());
            esDrugTypeService.remove(wrapper);
        }

        EsUseDrugInfo esUseDrugInfo = new EsUseDrugInfo();
        BeanUtils.copyProperties(esUseDrugInfoDto, esUseDrugInfo);
        this.save(esUseDrugInfo);

        if (CommonUtils.isNotBlank(esUseDrugInfoDto.getFirstUseAntibiotic())) {
            ArrayList<EsDrugType> esDrugTypes = new ArrayList<>();
            for (String drugName : esUseDrugInfoDto.getFirstUseAntibiotic()) {
                EsDrugType esDrugType = new EsDrugType();
                esDrugType.setDrugOrdrowid(esUseDrugInfo.getOrdrowid());
                esDrugType.setType(DrugEnum.FIRST_USE_ANTIBIOTIC.getName());
                esDrugType.setDrugName(drugName);
                esDrugTypes.add(esDrugType);
            }
            esDrugTypeService.saveBatch(esDrugTypes);
        }

        if (CommonUtils.isNotBlank(esUseDrugInfoDto.getOftenUseAntibiotic())) {
            ArrayList<EsDrugType> esDrugTypes = new ArrayList<>();
            for (String drugName : esUseDrugInfoDto.getOftenUseAntibiotic()) {
                EsDrugType esDrugType = new EsDrugType();
                esDrugType.setDrugOrdrowid(esUseDrugInfo.getOrdrowid());
                esDrugType.setType(DrugEnum.OFTEN_USE_ANTIBIOTIC.getName());
                esDrugType.setDrugName(drugName);
                esDrugTypes.add(esDrugType);
            }
            esDrugTypeService.saveBatch(esDrugTypes);
        }

        if (CommonUtils.isNotBlank(esUseDrugInfoDto.getOftenUseNSAID())) {
            ArrayList<EsDrugType> esDrugTypes = new ArrayList<>();
            for (String drugName : esUseDrugInfoDto.getOftenUseNSAID()) {
                EsDrugType esDrugType = new EsDrugType();
                esDrugType.setDrugOrdrowid(esUseDrugInfo.getOrdrowid());
                esDrugType.setType(DrugEnum.OFTEN_USE_NSAID.getName());
                esDrugType.setDrugName(drugName);
                esDrugTypes.add(esDrugType);
            }
            esDrugTypeService.saveBatch(esDrugTypes);
        }

        if (CommonUtils.isNotBlank(esUseDrugInfoDto.getIsUseAntacids())) {
            ArrayList<EsDrugType> esDrugTypes = new ArrayList<>();
            for (String drugName : esUseDrugInfoDto.getIsUseAntacids()) {
                EsDrugType esDrugType = new EsDrugType();
                esDrugType.setDrugOrdrowid(esUseDrugInfo.getOrdrowid());
                esDrugType.setType(DrugEnum.IS_USE_ANTACIDS.getName());
                esDrugType.setDrugName(drugName);
                esDrugTypes.add(esDrugType);
            }
            esDrugTypeService.saveBatch(esDrugTypes);
        }
    }

    @Override
    public EsUseDrugInfoDto getDrugInfo(String checkId) {
        EsUseDrugInfoDto esUseDrugInfoDto = new EsUseDrugInfoDto();
        LambdaQueryWrapper<EsUseDrugInfo> queryWrapper = new LambdaQueryWrapper<>();
        LambdaQueryWrapper<EsUseDrugInfo> eq = queryWrapper.eq(EsUseDrugInfo::getEsCheckId, checkId);
        EsUseDrugInfo esUseDrugInfo = this.getOne(eq);
        if (esUseDrugInfo == null){
            return null;
        }
        BeanUtils.copyProperties(esUseDrugInfo, esUseDrugInfoDto);

        LambdaQueryWrapper<EsDrugType> wrapper = new LambdaQueryWrapper<>();
        LambdaQueryWrapper<EsDrugType> eq1 = wrapper.eq(EsDrugType::getDrugOrdrowid, esUseDrugInfo.getOrdrowid());
        List<EsDrugType> list = esDrugTypeService.list(eq1);

        List<String> firstUseAntibiotic = new ArrayList<>();
        List<String> oftenUseAntibiotic = new ArrayList<>();
        List<String> oftenUseNSAID = new ArrayList<>();
        List<String> isUseAntacids = new ArrayList<>();

        for (EsDrugType esDrugType : list) {
            if (DrugEnum.FIRST_USE_ANTIBIOTIC.getName().equals(esDrugType.getType())) {
                firstUseAntibiotic.add(esDrugType.getDrugName());
            }

            if (DrugEnum.OFTEN_USE_ANTIBIOTIC.getName().equals(esDrugType.getType())) {
                oftenUseAntibiotic.add(esDrugType.getDrugName());
            }

            if (DrugEnum.OFTEN_USE_NSAID.getName().equals(esDrugType.getType())) {
                oftenUseNSAID.add(esDrugType.getDrugName());
            }

            if (DrugEnum.IS_USE_ANTACIDS.getName().equals(esDrugType.getType())) {
                isUseAntacids.add(esDrugType.getDrugName());
            }
        }
        esUseDrugInfoDto.setFirstUseAntibiotic(firstUseAntibiotic);
        esUseDrugInfoDto.setOftenUseAntibiotic(oftenUseAntibiotic);
        esUseDrugInfoDto.setOftenUseNSAID(oftenUseNSAID);
        esUseDrugInfoDto.setIsUseAntacids(isUseAntacids);
        return esUseDrugInfoDto;
    }
}
